高级语言被编译成机器代码时,有一个问题必须解决: CPU 没有办法知道一个函数需要调用多少个参数,即计算机不知道怎么给函数传参。传参工作必须由函数调用或者函数本身来协调。为此,计算机提供一种被称为栈的数据结构来支持参数传递。
需考虑
- 当参数多于一个时,按照什么顺序入栈。
- 函数调用后,由谁来恢复栈。
函数返回值放什么地方。
常用的调用规范有: stdcall , cdecl, thiscall
__stdcall:
- 参数由右向左顺序入栈
- 函数自身修改堆栈
- 函数名自动加下划线,后面紧跟@+参数大小(如: int func(int a, int b) => _func@8
__cdecl:
C语言函数的缺省调用约定
- 参数由右向左顺序入栈
- 调用者修改堆栈,因此 C语言支持不固定个数的参数。
- 函数名前自动加下划线
__thiscall:
唯一一个不能指明的函数修饰,C++ 类成员函数的缺省调用约定
- 参数由右向左入栈
- 若参数个数确定,则 this 指针通过 ecx 传给被调用者,否则 this 在所有参数压入栈后压栈。
- 参数确定时,函数自己清理堆栈。否则调用者清理堆栈。